/**
 * @fileOverview 散列表类源文件
 * @author <a href="http://sivory.my.phpcloud.com">Sivory</a>
 * @version 0.0.1
 */

(function() {

	/** @exports _Class as Name.Sivory.Castle.Util.HashTable */
	var _Class =

	/**
	 * @class 散别表类
	 * @author <a href="http://sivory.my.phpcloud.com">Sivory</a>
	 * @version 0.0.1
	 */
	Name.Sivory.Castle.Util.HashTable = function() {

			/**
			 * @private
			 * @field
			 * @type Object
			 * @description 用于记录散列表信息
			 * @since 0.0.1
			 */
			this._hash = {};

			/**
			 * @private
			 * @field
			 * @type Number
			 * @description 散列表中信息的条数
			 * @since 0.0.1
			 */
			this._count = 0;

		};

	/**
	 * @public
	 * @function
	 * @description 向散列表中添加数据
	 * @param {String} key 待添加的数据的索引
	 * @param {Object} value 待添加的数据
	 * @returns {Boolean} 是否成功添加数据
	 * @since 0.0.1
	 */
	_Class.prototype.put = function(key, value) {
		if(this._hash.hasOwnProperty(key)) {
			this._hash[key] = value;
			return true;
		} else {
			this._hash[key] = value;
			this._count++;
			return true;
		}
	}

	/**
	 * @public
	 * @function
	 * @description 从散列表中取出数据
	 * @param {String} key 需要取出的数据的索引
	 * @returns {Object} 取出的数据
	 * @since 0.0.1
	 */
	_Class.prototype.get = function(key) {
		if(this.containsKey(key)) return this._hash[key];
	}

	/**
	 * @public
	 * @function
	 * @description 获得散列表中数据的数目
	 * @returns {Number} 散列表中数据的数目
	 * @since 0.0.1
	 */
	_Class.prototype.size = function() {
		return this._count;
	}

	/**
	 * @public
	 * @function
	 * @description 检查散列表是否为空
	 * @returns {Boolean} 检查结果
	 * @since 0.0.1
	 */
	_Class.prototype.isEmpty = function() {
		if(this._count <= 0) return true;
		else return false;
	}

	/**
	 * @public
	 * @function
	 * @description 检查散列表是否包含某一个索引
	 * @param {String} key 需要检测的索引
	 * @returns {Boolean} 检查结果
	 * @since 0.0.1
	 */
	_Class.prototype.containsKey = function(key) {
		return this._hash.hasOwnProperty(key);
	}

	/**
	 * @public
	 * @function
	 * @description 检查散列表是否包含某一个值
	 * @param {String} value 需要检测的值
	 * @returns {Boolean} 检查结果
	 * @since 0.0.1
	 */
	_Class.prototype.containsValue = function(value) {
		for(var strKey in this._hash) {
			if(this._hash[strKey] === value) return true;
		}
		return false;
	}

	/**
	 * @public
	 * @function
	 * @description 删除散列表中的某个索引
	 * @param {String} key 待删除数据的索引
	 * @since 0.0.1
	 */
	_Class.prototype.remove = function(key) {
		delete this._hash[key];
		this._count--;
	}

	/**
	 * @public
	 * @function
	 * @description 清空整个散列表
	 * @since 0.0.1
	 */
	_Class.prototype.clear = function() {
		this._hash = {};
		this._count = 0;
	}

	/**
	 * @public
	 * @function
	 * @description 取得整个散列表的索引的集合，若散列表中没有元素则返回null
	 * @returns {Array 索引的集合
	 * @since 0.0.1
	 */
	_Class.prototype.keySet = function() {
		var arrKeySet = new Array();
		var index = 0;

		for(var strKey in this._hash) {
			arrKeySet[index++] = strKey;
		}
		return(arrKeySet.length == 0) ? null : arrKeySet;
	}

	/**
	 * @public
	 * @function
	 * @description 取得整个散列表的值的集合，若散列表中没有元素则返回null
	 * @returns {Array} 值的集合
	 * @since 0.0.1
	 */
	_Class.prototype.values = function() {
		var arrValues = new Array();
		var index = 0;
		for(var strKey in this._hash) {
			arrValues[index++] = this._hash[strKey];
		}
		return(arrValues.length == 0) ? null : arrValues;
	}

	/**
	 * @public
	 * @function
	 * @description 对当前散列表进行JSON编码
	 * @returns {String} 编码后的JSON字符串
	 * @since 0.0.1
	 */
	_Class.prototype.encode = function() {
		return JSON.stringify(hash);
	}

	/**
	 * @public
	 * @static
	 * @function
	 * @description 对所给的JSON字符串进行解码
	 * @returns {Name.Sivory.Castle.Util.HashTable} 解码后的散列表对象
	 * @since 0.0.1
	 */
	_Class.decode = function(jsonStr) {
		var hashTemp = new Name.Sivory.Castle.Util.HashTable();
		try {
			hashTemp._hash = eval("(" + jsonStr + ")");
			return hashTemp;
		} catch(err) {
			console.log("实例化哈希表失败");
		}
	}
	
})();